# -*-coding:utf-8-*-
import logging
import os
import time

import colorlog

from config import config
from config.config import log_path, MAX_LOG_FILE_NUM, Current_log_path


def init_logfile():
    log_file_path = os.path.join(config.root_path, 'logs')
    if not os.path.exists(log_file_path):
        os.makedirs(log_file_path)


class Logger:
    """
    终端打印不同颜色的日志，在pycharm中如果强行规定了日志的颜色，这个方法将不会起作用，
    但是对于终端，这个方法是可以打印不同颜色的日志
    """
    # 定义一个处理器，可以实现所有的logger都使用同一个Handler
    sh = logging.StreamHandler()

    def __new__(cls, *args, **kwargs):
        """
        实现只有一个实例
        """
        # 判断是否存在类属性_instance,_instance是类的唯一属性，即单例
        if not hasattr(cls, "_instance"):
            # 如果类存在一个类属性
            cls._instance = super(Logger, cls).__new__(cls)
        return cls._instance

    def __init__(self, file_path=log_path):
        # 创建一个日志器
        init_logfile()
        self.logger = logging.getLogger("AutoTest")
        # 将日志器的打印层级设置为debug，即打印所有类型的日志
        self.logger.setLevel(logging.DEBUG)
        # 配置不同层级，对应不同颜色
        self.log_colors_config = {
            "DEBUG": "cyan",
            "INFO": "green",
            "WARNING": "yellow",
            "ERROR": "red",
            "CRITICAL": "red"
        }
        # 新增处理器(打印至控制台)
        self.ch = logging.StreamHandler()
        # 设置日志打印的层级
        self.ch.setLevel(logging.INFO)
        # 新增打印日志的格式器，格式为： 时间(年月日时分秒) 日志器名称 层级名称:打印消息
        self.formatter = colorlog.ColoredFormatter(
            '%(log_color)s%(asctime)s  %(name)s %(levelname)s: %(message)s',
            log_colors=self.log_colors_config)
        # 设置打印的格式
        self.ch.setFormatter(self.formatter)
        # 将控制台打印处理器添加到对象中
        self.logger.addHandler(self.ch)
        # 根据日期组装成存储的文件名称
        file_path = os.path.join(file_path, str(
            time.strftime("%Y-%m-%d") + ".log"))
        # 新增处理器，将日志存入文件
        self.fh = logging.FileHandler(file_path, encoding="utf-8")
        # 设置存入文件的日志层级(只存储info层级以上的日志)
        self.fh.setLevel(logging.INFO)
        # 新增写入文件的格式器
        self.file_formatter = logging.Formatter(
            " %(asctime)s %(name)s %(levelname)s:%(message)s")
        # 设置写入文件的格式
        self.fh.setFormatter(self.file_formatter)
        # 把处理器添加添加到logger中
        self.logger.addHandler(self.fh)
        # 分别记录每次执行的日志
        self.fh_now = logging.FileHandler(Current_log_path, encoding="utf-8")
        self.fh_now.setLevel(logging.INFO)
        self.fh_now.setFormatter(self.file_formatter)
        self.logger.addHandler(self.fh_now)

    def debug(self, message):
        self.logger.debug(message)

    def info(self, message):
        self.logger.info(message)

    def warning(self, message):
        self.logger.warning(message)

    def error(self, message):
        self.logger.error(message)

    def critical(self, message):
        self.logger.critical(message)

    def delete_log_file(self):
        if len(os.listdir(log_path)) > MAX_LOG_FILE_NUM:
            self.info("删除30天以上的日志.")
            c_time_list = []
            for i in os.listdir(log_path):
                c_time_list.append(os.path.getctime(os.path.join(log_path, i)))
            c_time_list.sort()
            for each in os.listdir(log_path):
                if os.path.getctime(os.path.join(log_path, each)) == \
                        c_time_list[0] and \
                        os.path.splitext(os.path.join(log_path, each))[
                            1] == ".log":
                    os.remove(os.path.join(log_path, each))
                    break


log = Logger()
if __name__ == '__main__':
    print(config.root_path)
    log_path = os.path.join(config.root_path, 'logs')
    print(log_path)
    print(os.path.exists(log_path))
    os.makedirs(log_path)
